// 文件路径: dbms/parser/ast/FunctionCallNode.java
package com.dbms.parser.ast;

import java.util.List;
import java.util.stream.Collectors;

/**
 * FunctionCallNode (函数调用节点) 代表一个函数调用的抽象语法树 (AST) 节点。
 * 例如，在 `SELECT UPPER(name), COUNT(*)` 中，`UPPER(name)` 和 `COUNT(*)`
 * 都会被解析成 FunctionCallNode。
 */
public class FunctionCallNode extends AstNode {

    /**
     * 函数的名称，例如 "UPPER" 或 "COUNT"。
     */
    private final String functionName;
    /**
     * 传递给函数的参数列表。
     * 参数可以是列名 (String)、字符串字面量 (String) 或数字字面量 (Integer/Double)。
     * 使用 `List<Object>` 来灵活地存储不同类型的参数。
     */
    private final List<Object> arguments;

    public FunctionCallNode(String functionName, List<Object> arguments) {
        this.functionName = functionName;
        this.arguments = arguments;
    }

    /**
     * 获取函数名。
     * @return 函数名字符串
     */
    public String getFunctionName() {
        return functionName;
    }

    /**
     * 获取参数列表。
     * @return 参数对象的列表
     */
    public List<Object> getArguments() {
        return arguments;
    }

    /**
     * 生成该函数调用的字符串表示，格式与 SQL 语法一致。
     * @return 例如 "UPPER(name)"
     */
    @Override
    public String toString() {
        // 使用 Stream API 将参数列表连接成一个逗号分隔的字符串
        String args = arguments.stream()
                .map(Object::toString)
                .collect(Collectors.joining(", "));
        return functionName + "(" + args + ")";
    }
}